﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace Client.Encriptacion.logica
{
    class Encriptacion
    {
        Encriptacion() { }

        public static BitArray Encriptar(BitArray entrada, BitArray[] claves)
        {
            //throw new NotImplementedException();
            BitArray[] salida = new BitArray[2];
            BitArray temporal;
            BitArray cifradoFinal = new BitArray(64);
            //BitArray procesar = TransformarABinario.transformarABinario(entrada);
            BitArray permu = Permutar.permutarBien(entrada, Cajas.PermInicial);
            IO.ImprimePasos("primera permutación:\n" + IO.BitArrayToString(permu, 8));
            IO.ImprimePasos("Se divide la entrada en dos trozos:");
            BitArray[] porciones = Dividir.dividir(permu, 2);
            IO.ImprimePasos("trozo 1:\n" + IO.BitArrayToString(porciones[0], 8));
            IO.ImprimePasos("trozo 2:\n" + IO.BitArrayToString(porciones[1], 8));
            IO.ImprimePasos("Comienzan los 16 iteraciones de DES...");
            for (int i = 0; i < 16; i++)
            {
                salida = AlgoritmoDES.ProcesoIter(porciones, claves, i);
                if (i < 15) 
                {
                    porciones = salida;
                    IO.ImprimePasos("Iteración " + (i + 1) + "\ntrozo 1:\n" 
                       + IO.BitArrayToString(salida[0], 8) + "\ntrozo 2:\n"
                       + IO.BitArrayToString(salida[1], 8));
                }
                else
                {
                    temporal = Concatenar.concatenar(salida);
                    //IO.ImprimeBitArray(temporal, 32);
                    //cifradoFinal = Permutar.permutarBien(temporal, Cajas.Permt_Final);
                    porciones = Dividir.dividir(temporal, 2);
                    salida[0] = porciones[1];
                    salida[1] = porciones[0];
                    cifradoFinal = Concatenar.concatenar(salida);
                    temporal = Permutar.permutarBien(cifradoFinal, Cajas.Permt_Final);
                    cifradoFinal = temporal;
                    //IO.ImprimeBitArray(cifradoFinal, 32);
                    IO.ImprimePasos("Iteración final\n" + IO.BitArrayToString(cifradoFinal, 8));

                }
                

            }
            return cifradoFinal;
        }
    }
}
